#include <GL/glut.h>

GLsizei winWidth = 600, winHeight = 500;
GLint xRaster = 25, yRaster = 150;
GLubyte label[36] = { 
	'J', 'a', 'n',  'F', 'e', 'b',  'M', 'a', 'r',
	'A', 'p', 'r',  'M', 'a', 'y',  'J', 'u', 'n',
	'J', 'u', 'l',  'A', 'u', 'g',  'S', 'e', 'p',
	'O', 'c', 't',  'N', 'o', 'v',  'D', 'e', 'c'
};
GLint dataValue[12] = { 
	420, 342, 324, 310, 262, 185,
	190, 196, 217, 240, 312, 438
};


// static保证只有本代码文件会调用该函数
void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0);	// 设置窗口显示颜色为白色
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0, 600.0, 0.0, 500.0);
}

void lineGraph(void)
{
	GLint month, k;
	GLint x = 30;

	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0, 0.0, 1.0);

	// 画线
	glBegin(GL_LINE_STRIP);
	for (k = 0; k < 12; k++)
		glVertex2i(x + k * 50, dataValue[k]);
	glEnd();

	// 画*
	glColor3f(1.0, 0.0, 0.0);
	for (k = 0; k < 12; k++) {
		glRasterPos2i(xRaster + k * 50, dataValue[k] - 4);
		glutBitmapCharacter(GLUT_BITMAP_9_BY_15, '*');
	}

	glColor3f(0.0, 0.0, 0.0);
	xRaster = 20;
	for (month = 0; month < 12; month++) {
		glRasterPos2i(xRaster, yRaster);
		for (k = 3 * month; k < 3 * month + 3; k++)
			glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, label[k]);
		xRaster += 50;
	}

	glFlush();
}

void barChart(void)
{
	GLint month, k;
	glClear(GL_COLOR_BUFFER_BIT);

	// 画*
	glColor3f(1.0, 0.0, 0.0);
	for (k = 0; k < 12; k++) {
		glRecti(20 + k * 50, 165, 40 + k * 50, dataValue[k]);
	}

	glColor3f(0.0, 0.0, 0.0);
	xRaster = 20;
	for (month = 0; month < 12; month++) {
		glRasterPos2i(xRaster, yRaster);
		for (k = 3 * month; k < 3 * month + 3; k++)
			glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, label[k]);
		xRaster += 50;
	}
	glFlush();

}

void winReshapeFcn(int newWidth, int newHeight)
{
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();	// 恢复坐标系
	gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight));
	glClear(GL_COLOR_BUFFER_BIT);
}


void main(int argc, char** argv)
{
	glutInit(&argc, argv);							// 初始化glut（可不写默认）
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);	// 显示模式初始化 单缓冲模式 RGB显示模式
	glutInitWindowPosition(100, 100);				// 窗口距离左和上的距离（可不写默认）
	glutInitWindowSize(winWidth, winHeight);		// 窗口的宽和高（可不写默认）
	glutCreateWindow("Line Chart Data Plot");		// 窗口名称

	init();											// 执行初始化程序
	glutDisplayFunc(barChart);						// 自定义函数绘图
	glutReshapeFunc(winReshapeFcn);					// 窗口修改后显示
	glutMainLoop();									// 消息循环响应
}
